.Dd July 17, 2014
.Dt BIO_FIND_TYPE 3
.Os
.Sh NAME
.Nm BIO_find_type ,
.Nm BIO_next ,
.Nm BIO_method_type
.Nd BIO chain traversal
.Sh SYNOPSIS
.In openssl/bio.h
.Ft BIO *
.Fo BIO_find_type
.Fa "BIO *b"
.Fa "int bio_type"
.Fc
.Ft BIO *
.Fo BIO_next
.Fa "BIO *b"
.Fc
.Fd #define BIO_method_type(b)	((b)->method->type)
.Fd #define BIO_TYPE_NONE		0
.Fd #define BIO_TYPE_MEM		(1|0x0400)
.Fd #define BIO_TYPE_FILE		(2|0x0400)
.Fd #define BIO_TYPE_FD			(4|0x0400|0x0100)
.Fd #define BIO_TYPE_SOCKET		(5|0x0400|0x0100)
.Fd #define BIO_TYPE_NULL		(6|0x0400)
.Fd #define BIO_TYPE_SSL		(7|0x0200)
.Fd #define BIO_TYPE_MD			(8|0x0200)
.Fd #define BIO_TYPE_BUFFER		(9|0x0200)
.Fd #define BIO_TYPE_CIPHER		(10|0x0200)
.Fd #define BIO_TYPE_BASE64		(11|0x0200)
.Fd #define BIO_TYPE_CONNECT		(12|0x0400|0x0100)
.Fd #define BIO_TYPE_ACCEPT		(13|0x0400|0x0100)
.Fd #define BIO_TYPE_PROXY_CLIENT	(14|0x0200)
.Fd #define BIO_TYPE_PROXY_SERVER	(15|0x0200)
.Fd #define BIO_TYPE_NBIO_TEST	(16|0x0200)
.Fd #define BIO_TYPE_NULL_FILTER	(17|0x0200)
.Fd #define BIO_TYPE_BER		(18|0x0200)
.Fd #define BIO_TYPE_BIO		(19|0x0400)
.Fd #define BIO_TYPE_DESCRIPTOR	0x0100
.Fd #define BIO_TYPE_FILTER		0x0200
.Fd #define BIO_TYPE_SOURCE_SINK	0x0400
.Sh DESCRIPTION
The function
.Fn BIO_find_type
searches for a BIO of a given type in a chain, starting at BIO
.Fa b .
If
.Fa bio_type
is a specific type (such as
.Dv BIO_TYPE_MEM ) ,
then a search is made for a BIO of that type.
If
.Fa bio_type
is a general type (such as
.Dv BIO_TYPE_SOURCE_SINK ) ,
then the next matching BIO of the given general type is searched for.
.Fn BIO_find_type
returns the next matching BIO or
.Dv NULL
if none is found.
.Pp
Note: not all the
.Dv BIO_TYPE_*
types above have corresponding BIO implementations.
.Pp
.Fn BIO_next
returns the next BIO in a chain.
It can be used to traverse all BIOs in a chain or used in conjunction with
.Fn BIO_find_type
to find all BIOs of a certain type.
.Pp
.Fn BIO_method_type
returns the type of a BIO.
.Sh RETURN VALUES
.Fn BIO_find_type
returns a matching BIO or
.Dv NULL
for no match.
.Pp
.Fn BIO_next
returns the next BIO in a chain.
.Pp
.Fn BIO_method_type
returns the type of the BIO
.Fa b .
.Sh NOTES
.Fn BIO_next
was added to OpenSSL 0.9.6 to provide a 'clean' way to traverse a BIO
chain or find multiple matches using
.Fn BIO_find_type .
Previous versions had to use:
.Pp
.Dl next = bio->next_bio;
.Sh BUGS
.Fn BIO_find_type
in OpenSSL 0.9.5a and earlier could not be safely passed a
.Dv NULL
pointer for the
.Fa b
argument.
.Sh EXAMPLE
Traverse a chain looking for digest BIOs:
.Bd -literal -offset 2n
BIO *btmp;
btmp = in_bio;	/* in_bio is chain to search through */

do {
	btmp = BIO_find_type(btmp, BIO_TYPE_MD);
	if (btmp == NULL)
		break;	/* Not found */
	/* btmp is a digest BIO, do something with it ...*/
	...

	btmp = BIO_next(btmp);
} while(btmp);
.Ed
